iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0

技術筆記

不同型別在變數之間的傳遞會產生不同的行為,筆記一下根本的原因,清楚了解之後,對於之後在寫程式很有幫助。

原始型別

  • 又稱純值(Primitive Type)
  • 表示單一值的資料型別
  • JavaScript中六種純值,除symbol外,在Day 5型別皆有介紹過, symbol是在ES6之後才出現的,透過Symbol()產生,每個Symbol值被產生出來後,存放在不同記憶體。
    • null
    • undefined
    • number
    • string
    • Boolean
    • symbol

物件型別

  • 除原始型別以外的型別

變數指派

  • 原始型別指派變數(call by value)
    • 當一個存放原始型別的變數A被傳遞給另一個變數B,變數B接收到的是變數A的內容值複製
    var a = 3 //a為純值變數,記憶體位置:0x001
    var b = a //b為變數a內容的複製,記憶體位置:0x002
    
    b = 5
    console.log(a)  //3
    
    • 因記憶體位置不同,a跟b其實是不同的變數,重新對b指派其他值,並不會影響到a
  • 物件型別指派變數(call by reference)
    • 當一個物件被指派給變數時,這個物件並不是真的被存在變數裡面,而是被純放在另一個記憶體位置,所以物件在指派給變數時所傳的是記憶體位置的參考
    var a = { name: `Julia`} //物件變數,去記憶體位置(0x003)取值
    var b = a //根據a提供的位置參考,去同一個記憶體位置(0x003)取值
    
    b.name = `Stella`
    console.log(a) // {name: 'Stella'}
    
    • 所以a跟b對到的是在同一個物件,所以改變b值,a值也會改變
  • call by sharing?
    • 當JavaScript傳物件給函式時,可以改變原物件的值,但重新賦值就切斷了原本的連結,有了新的記憶體位置,所以不會改變原本外面的物件
    • 所以有人說物件其實是call by sharing

結論

不管是三明治書中還是huli老師都有提到大家對於call by value與call by reference都有各自分歧的意見,可能是因為在程式世界中, 名詞創造經常非常隨意,但重點其實在於搞懂不同型別的變數在JavaScript中的傳遞行為,才是對自己理解JavaScript比較有幫助的地方。

參考資料

童言童語

努力看完天書後,來點輕鬆的吧!分享我兒子的童言童語,調劑身心一下

5歲樂咖+2歲嗨啾 = 我的神奇寶貝 皮咖啾

2022/12/15
繼理光頭後阿咖又想突破
阿咖有天形容了他想剃的髮型(河童頭)⋯
我傻眼
吵了幾天後終於問出原因
我:為什麼你想要剃那樣?那樣有點奇怪⋯
咖:說不定剃出來很帥阿!5號對我很好的公車司機也剪那樣啊!
我:你知道什麼是禿頭嗎⋯


上一篇
Day10 提升hoisting
下一篇
Day 12 函式陳述式&函式表達式
系列文
豆芽班日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言